<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<script>
  function fn() {
    try {
      const str = 123
      str.concat('e')
    } catch (error) {
      console.log(error)
      // TypeError: str.concat is not a function
      // at fn (test.html?_ijt=gat522eprvgdc9c9nm76jcgvpe&_ij_reload=RELOAD_ON_SAVE:12:23)
      // at test.html?_ijt=gat522eprvgdc9c9nm76jcgvpe&_ij_reload=RELOAD_ON_SAVE:28:3

      // JSON.stringify 打印不出 error 中的信息，因为 JSON.stringify 默认转换对象自身可枚举属性
      console.log(JSON.stringify(error)) // {}

      /**
       * 我们查看一下 error 上都有啥属性？同时可以了解一下获取对象自身属性有哪些方式？
       * */

      // 获取对象所有自身属性名（包括不可枚举属性）
      console.log(Object.getOwnPropertyNames(error)) // ['stack', 'message']

      // 获取对象所有可枚举的自身属性名
      console.log(Object.keys(error)) // []

      // 获取对象所有自身属性（包括字符串键和 Symbol 键）
      console.log(Reflect.ownKeys(error)) // ['stack', 'message']

      // for in 没执行说明error上没有可枚举的属性
      for (const key in error) {
        console.log(key)
      }

      // （扩展）获取对象所有 Symbol 类型的自身属性
      const sym = Symbol('description');
      const obj = {[sym]: 'symbol value', a: 1};
      console.log(Object.getOwnPropertySymbols(obj)) // [Symbol(description)]
    }
  }

  fn()
</script>
</body>
</html>